package interfaceGraphique;


import generationTache.IGenerationTache;
import generationTache.generationAleatoire.TacheAperiodiqueAl;
import generationTache.generationAleatoire.TachePeriodiqueAl;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

import mainPack.Main;

import ordonnanceur.EDF_BG;
import ordonnanceur.EDF_TBS;
import ordonnanceur.RM_BG;
import outils.ManipulationFichier;

/**
 * Fenetre principale de l'application
 * @author nicolas rault et matthieu allon
 *
 */
public class Accueil extends JFrame implements ActionListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private FenNbTache fenNbTache;
	private static Accueil singletonAccueil;
	private JLabel center;
	private JPanel contenuFenetre;
	private FenGenTache fenGenTache;
	private FenTacheControle fenTacheControle;
	
	/**
	 * Constructeur de la fenetre
	 */
	private Accueil()
	{
		super("Schedul'Task - V.1.0 - Bienvenue !");
		
		
		this.addWindowListener(new fermetureFenetre());
		contenuFenetre = new JPanel();
		BorderLayout gbl = new BorderLayout();
		contenuFenetre.setLayout(gbl);
		
		
		JMenuBar menu = new JMenuBar();
		this.setJMenuBar(menu);
		JMenu outils = new JMenu("Outils");
		menu.add(outils);
				
		JMenuItem rechercheItineraire = new JMenuItem("Creer des taches");
		rechercheItineraire.addActionListener(this);
		outils.add(rechercheItineraire);
		
		center = new JLabel();
		contenuFenetre.add(center,BorderLayout.CENTER);
		repaint();
	}
	
	/**
	 * Permet de dessiner l'image de la fenetre principale.
	 * @param g parametre par defaut de la methode
	 */
	public void paint(Graphics g)
	{
		super.paintComponents(g);
		Image image = getToolkit().getImage(Main.class.getResource("kiwi-3.jpg"));//		
		g.drawImage(image, 50, 50, this); // ... on la dessine
	}
	
	/**
	 * Permet d'autoriser une seule creation de la fenetre Accueil.
	 * @return la fenetre accueil
	 */
	public static Accueil getInstance() 
	{
		if (singletonAccueil == null) 
		{
			singletonAccueil = new Accueil();
		}
		return singletonAccueil;
	}
	
	/**
	 * Permet de regrouper les differents parametre rentre par l'utilisateur
	 * Permet l'appel aux differents ordonnanceurs
	 */
	public void genTache()
	{
		ArrayList<IGenerationTache> listeTacheP = new ArrayList<IGenerationTache>();
		ArrayList<IGenerationTache> listeTacheAp = new ArrayList<IGenerationTache>();
		//Recuperer Controle ou aleatoire
		fenGenTache = FenGenTache.getInstance("");
		int tacheP = 0;
		int tacheAp = 0;
		boolean controle = fenGenTache.getGenerationTache();
		//si controle
		fenNbTache = FenNbTache.getInstance();
		tacheP = fenNbTache.recupNbTachePeriodique();
		tacheAp = fenNbTache.recupNbTacheAperiodique();
		if(!controle)
		{
			//On recupere les taches entrees par l'utilisateur
			fenTacheControle = FenTacheControle.getInstance();
			listeTacheP=fenTacheControle.getListeTacheP();
			listeTacheAp=fenTacheControle.getListeTacheAp();
		}
		else
		{
			//On cree les taches aleatoirements
			int i=0;
			while(i<tacheP){
				TachePeriodiqueAl tacheAleatoire = new TachePeriodiqueAl(fenNbTache.recupUp());
				tacheAleatoire.calculParamTachePeriodAlea(tacheP);
				listeTacheP.add(tacheAleatoire);
				i++;
			}
			
			i=0;
			while(i<tacheAp){
				TacheAperiodiqueAl tacheAleatoire = new TacheAperiodiqueAl(fenNbTache.recupUp(), listeTacheP);
				listeTacheAp.add(tacheAleatoire);
				i++;
			}
		}
		//On sauvegarde dans les fichiers
		ManipulationFichier<IGenerationTache> outils = new ManipulationFichier<IGenerationTache>();
		outils.sauvegardeTache(listeTacheP, "TacheP");
		outils.sauvegardeTache(listeTacheAp, "TacheAp");
		//On recupère le choix de l'ordonnanceur tacheP
		boolean RMBG = fenGenTache.getOrdoTacheP();
		
		//On recupère le choix de l'ordonnanceur tacheAp
		boolean BGTBS = fenGenTache.getOrdoTacheAp();
		boolean testSimul = FenChoixOrdoSimul.getInstance().getTestSimul();
		String ordo = "";
		if(!RMBG)
		{
			//c'est donc RM
			RM_BG rmbg = new RM_BG();
			ordo = rmbg.testOrdonnancement();
		}
		else
		{
			if(!BGTBS)
			{
				//C'est EDF_BG
				EDF_BG edf_bg = new EDF_BG();
				ordo = edf_bg.testOrdonnancement();
			}
			else
			{
				//C'est EDF_TBS
				EDF_TBS edfTbs = new EDF_TBS();
				ordo = edfTbs.testOrdonnancement();
			}
		}
		if(!testSimul)
		{
			//Si on souhaitait juste faire une demande de faisabilite de l'ordonnacement
			FenError error = FenError.getInstance("Resultat");
			error.changeLabel(ordo);
			error.setVisible(true);
			error.setLocation(30, 100);
		}
		else
		{
			//Si on souhaite ordonnancer les taches
			FenFichierTexte fen = FenFichierTexte.getInstance();
			String nomFichier = fen.getNomFichier();
			if(nomFichier.equals(""))
			{
				nomFichier = "defaut";
			}
			ArrayList<String> listeKiwi = new ArrayList<String>();
			if(ordo.equals("On ne sait pas si le systeme est ordonnancable") || ordo.equals("Le systeme est ordonnancable"))
			{
				if(!RMBG)
				{
					//c'est RM_BG
					RM_BG rm_bg = new RM_BG();
					rm_bg.ordonnancement();
					listeKiwi = rm_bg.getListeKiwi();
					outils.sauvegardeKiwi(listeKiwi, nomFichier, tacheP+tacheAp, rm_bg.getDuration());
				}
				else
				{
					if(!BGTBS)
					{
						//C'est EDF_BG
						EDF_BG edf_bg = new EDF_BG();
						edf_bg.ordonnancement();
						listeKiwi = edf_bg.getListeKiwi();
						outils.sauvegardeKiwi(listeKiwi,nomFichier, tacheP+tacheAp, edf_bg.getDuration());
					}
					else
					{
						//C'est EDF_TBS
						EDF_TBS edf_tbs = new EDF_TBS();
						edf_tbs.ordonnancement();
						listeKiwi = edf_tbs.getListeKiwi();
						outils.sauvegardeKiwi(listeKiwi, nomFichier, tacheP+tacheAp, edf_tbs.getDuration());
					}
				}
			}
			else
			{
				// Pas ordonnançable
				FenError error = FenError.getInstance("Resultat");
				error.changeLabel(ordo);
				error.setVisible(true);
			}
		}
			
		
	}
	
	/**
	 * Permet de fermer la fenetre principale.
	 * @author nicolas rault et matthieu allon
	 *
	 */
	public class fermetureFenetre extends WindowAdapter
	{
		public void windowClosing (WindowEvent e)
		{
			System.exit(0);
		}
	}
	
	/**
	 * Permet d'assigner une action aux differents evenements survenus sur la fenetre.
	 * @param e evenement recupere par la fenetre
	 */
	public void actionPerformed(ActionEvent e) {
		String nomBouton = e.getActionCommand();//e renvoie le bouton selectionne

		if(nomBouton.equals("Creer des taches")){
			fenNbTache = FenNbTache.getInstance();
			fenNbTache.setLocation(30, 100);
			fenNbTache.setVisible(true);
		}
	}

}